package org.soderiakelvy.model.service.imp;

import java.io.Serializable;
import java.util.Date;
import java.util.List;


import org.soderiakelvy.model.dao.PersonalDao;
import org.soderiakelvy.model.dao.RepartoDao;
import org.soderiakelvy.model.dao.VehiculoDao;
import org.soderiakelvy.model.dao.VisitaDao;
import org.soderiakelvy.model.dao.imp.PersonalDaoImp;
import org.soderiakelvy.model.dao.imp.RepartoDaoImp;
import org.soderiakelvy.model.dao.imp.VehiculoDaoImp;
import org.soderiakelvy.model.dao.imp.VisitaDaoImp;
import org.soderiakelvy.model.domain.PersonalVO;
import org.soderiakelvy.model.domain.RepartoVO;
import org.soderiakelvy.model.domain.RolVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.VehiculoVO;
import org.soderiakelvy.model.domain.VisitaVO;
import org.soderiakelvy.model.service.RepartoServicio;
import org.soderiakelvy.model.util.ConstantModel;

public class RepartoServicioImp implements RepartoServicio, Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private RepartoDao repartoDao;
	private VisitaDao visitaDao;
	private PersonalDao personalDao;
	private VehiculoDao vehiculoDao;
	
	//--- CONSTRUCTOR ---
	public RepartoServicioImp(){
		repartoDao 	= new RepartoDaoImp();
		visitaDao 	= new VisitaDaoImp();
		personalDao = new PersonalDaoImp();
		vehiculoDao = new VehiculoDaoImp();
	}

	//--- END CONSTRUCTOR---
	
	//--- METODOS DE REPARTO ---
	@Override
	public String insertReparto(RepartoVO reparto) {
		reparto.setNombre(reparto.getNombre().toUpperCase().trim());
		reparto.setEstado("HABILITADO");
		
		if(!existeNombreReparto(reparto)){
			try {
				repartoDao.insertRepartoVO(reparto);
				actualizarEstadoVehiculo(reparto, ConstantModel.ESTADO_VEHICULO_ASIGNADO);
				return ConstantModel.SUCCESS;
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Error al insertar un reparto. "+e.getMessage());
				return ConstantModel.FAILED;
			}
		}else return ConstantModel.NOMBRE_DUPLICADO;
	}
	
	private String actualizarEstadoVehiculo(RepartoVO reparto, String estado){
		VehiculoVO vehiculo = vehiculoDao.getVehiculoById(reparto.getVehiculo().getVehiculoId());
		vehiculo.setEstado(estado);
		return updateVehiculo(vehiculo);
	}

	@Override
	public String updateReparto(RepartoVO reparto) {
		reparto.setNombre(reparto.getNombre().toUpperCase().trim());
		if(!existeNombreReparto(reparto)){
			try {
				
				VehiculoVO vehiculoAnterior = vehiculoDao.getVehiculoById(repartoDao.getRepartoById(reparto.getRepartoId()).getVehiculo().getVehiculoId());
				vehiculoAnterior.setEstado(ConstantModel.ESTADO_VEHICULO_LIBRE);
				updateVehiculo(vehiculoAnterior);
				
				repartoDao.updateRepartoVO(reparto);
				
				VehiculoVO vehiculoActual = vehiculoDao.getVehiculoById(reparto.getVehiculo().getVehiculoId());
				vehiculoActual.setEstado(ConstantModel.ESTADO_VEHICULO_ASIGNADO);
				updateVehiculo(vehiculoActual);
				
				return ConstantModel.SUCCESS;
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Error al modificar un reparto. "+e.getMessage());
				return ConstantModel.FAILED;
			}
		}else return ConstantModel.NOMBRE_DUPLICADO;
		
	}
	@Override
	public Boolean existeNombreReparto(RepartoVO reparto){
		boolean result;
		RepartoVO r = repartoDao.getRepartoByNombre(reparto.getNombre().toUpperCase().trim());
		if(reparto.getRepartoId() == null){
			//un control de alta
			if(r !=null){
				result = true;
			}else {
				result = false;
			}
		}else {
			//control de update
			if(r != null){
				//existe un nombre en la BD
				if(r.getRepartoId().equals(reparto.getRepartoId())){
					result = false;
				}else{
					result = true;
				}
			}else{
				result = false;
			}
		}
		return result;
	}

	@Override
	public String deleteReparto(RepartoVO reparto) {
		if(visitaDao.getVisitaByReparto(reparto).size()==0){
			try {
				repartoDao.deleteRepartoVO(reparto);
				return ConstantModel.SUCCESS;
			} catch (Exception e) {
				System.out.println("Error al eliminar un reparto. "+e.getMessage());
				return ConstantModel.FAILED + "-"+e.getMessage();
			}
		}else{
			return ConstantModel.DELETE_ASIGNADO;
		}
	}
	
	

	@Override
	public List<RepartoVO> getRepartos() {
		try {
			return repartoDao.getRepartos();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al listar todo los repartos. "+e.getMessage());
			return null;
		}
	}

	@Override
	public RepartoVO getRepartoById(long repartoId) {
		try {
			return repartoDao.getRepartoById(repartoId);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	//--- END METODO DE REPARTO ---
	//--- METODOS DE VISITA ---
	@Override
	public String insertVisita2(VisitaVO visita, String[] diasSeleccionados) {
		for(int i = 0; i<diasSeleccionados.length;i++){
			if(diasSeleccionados[i].equals("1")){
				visita.setLunes((short)1);
			}
			if(diasSeleccionados[i].equals("2")){
				visita.setMartes((short)1);
			}
			if(diasSeleccionados[i].equals("3")){
				visita.setMiercoles((short)1);
			}
			if(diasSeleccionados[i].equals("4")){
				visita.setJueves((short)1);
			}
			if(diasSeleccionados[i].equals("5")){
				visita.setViernes((short)1);
			}
			if(diasSeleccionados[i].equals("6")){
				visita.setSabado((short)1);
			}
		}
		try {
			visitaDao.insertVisitaVO(visita);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un Visita "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}
	
	@Override
	public String insertVisita(VisitaVO visita) {
		try {
			visitaDao.insertVisitaVO(visita);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un Visita "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String updateVisita2(VisitaVO visita,String[] diasSeleccionados) {
		visita.setLunes((short) 0);
		visita.setMartes((short) 0);
		visita.setMiercoles((short) 0);
		visita.setJueves((short) 0);
		visita.setViernes((short) 0);
		visita.setSabado((short) 0);
		for(int i = 0; i<diasSeleccionados.length;i++){
			if(diasSeleccionados[i].equals("1")){
				visita.setLunes((short)1);
			}
			if(diasSeleccionados[i].equals("2")){
				visita.setMartes((short)1);
			}
			if(diasSeleccionados[i].equals("3")){
				visita.setMiercoles((short)1);
			}
			if(diasSeleccionados[i].equals("4")){
				visita.setJueves((short)1);
			}
			if(diasSeleccionados[i].equals("5")){
				visita.setViernes((short)1);
			}
			if(diasSeleccionados[i].equals("6")){
				visita.setSabado((short)1);
			}
		}
		try {
			System.out.println("Update visita ID: "+visita.getVisitaId());
			visitaDao.updateVisitaVO(visita);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al modificar un Visita "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}
	
	
	@Override
	public String updateVisita(VisitaVO visita) {
		try {
			visitaDao.updateVisitaVO(visita);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al modificar un Visita "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deleteVisita(VisitaVO visita) {
		try {
			visitaDao.deleteVisitaVO(visita);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al eliminar un Visita "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public VisitaVO getVisitaBySucursal(SucursalVO sucursal) {
		try {
			return visitaDao.getVisitaBySucursal(sucursal);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error getVisita por sucursal "+e.getMessage());
			return null;
		}
	}
	//-------------------------------------------------------------------

	//--- PERSONAL ----
	@Override
	public String insertPersonal(PersonalVO personal) {
		try {			
			personalDao.insertPersonalVO(personal);
			return ConstantModel.SUCCESS;
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un nuevo Personal: "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String updatePersonal(PersonalVO personal) {
		try {
			personalDao.updatePersonalVO(personal);
			return ConstantModel.SUCCESS;
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al modificar un nuevo Personal: "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deletePersonal(PersonalVO personal) {
		try {			
			personalDao.deletePersonalVO(personal);
			return ConstantModel.SUCCESS;
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al eliminar un nuevo Personal: "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public List<PersonalVO> getAllPersonal() {
		try {
			return personalDao.getAllPersonales();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al listar todo los personales. "+e.getMessage());
			return null;
		}
	}
	
	@Override
	public List<PersonalVO> getPersonalByCategoria(String categoria) {
		try {
			return personalDao.getPersonalByCategoria(categoria);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	@Override
	public List<PersonalVO> getPersonalByRol(RolVO rol) {
		try {
			return personalDao.getPersonalByRol(rol);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	//--- END METODOS DE PERSONAL ---
	//--- METODOS DE VEHICULO ---
	@Override
	public String insertVehiculo(VehiculoVO vehiculo) {
		vehiculo.setFechaAlta(new Date());
		getVehiculoWithMayuscula(vehiculo);
		vehiculo.setEstado(ConstantModel.ESTADO_VEHICULO_LIBRE);
		try {
			vehiculoDao.insertVehiculoVO(vehiculo);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un Vehiculo: " + e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String updateVehiculo(VehiculoVO vehiculo) {
		try {
			vehiculoDao.updateVehiculoVO(vehiculo);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al modificar un Vehiculo: " + e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deleteVehiculo(VehiculoVO vehiculo) {
		try {
			vehiculoDao.deleteVehiculoVO(vehiculo);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al eliminar un Vehiculo: " + e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public List<VehiculoVO > getAllVehiculo() {
		try {
			return vehiculoDao.getAllVehiculo();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al listar los vehiculos: " + e.getMessage());
			return null;
		}
	}

	@Override
	public List<VehiculoVO> getVehiculoByEstado(String estado) {
		try {
			return vehiculoDao.getVehiculoByEstado(estado);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	@Override
	public VehiculoVO getVehiculoById(long vehiculoId) {
		try {
			return vehiculoDao.getVehiculoById(vehiculoId);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	private VehiculoVO getVehiculoWithMayuscula(VehiculoVO v){
		v.setPatente(v.getPatente().toUpperCase().trim());
		v.setMarca(v.getMarca().toUpperCase().trim());
		return v;
	}
	//-------------------------------------------------------------------

	@Override
	public PersonalVO getPersonalByPersonal(PersonalVO personal) {
		try {
			return personalDao.getPersonalByPersonal(personal);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}



}
